home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / ACORNUSERS / CBSA / EDUCATION / MENU / cc / WimpMenu < prev    next >
Text File  |  1998-02-28  |  3KB  |  147 lines

  1.  
  2. //-----------------------------------
  3. //             WimpMenu.c
  4. //-----------------------------------
  5.  
  6.  
  7. #include <string.h>
  8. #include <os.h>
  9. #include <trap.h>
  10. #include "WimpError.h"
  11. #include "WimpMenu.h"
  12.  
  13. MenuItem::MenuItem(char * itemtext)
  14. {
  15.   flags=0;
  16.   submenu = -1;
  17.   icon_flags = 0x7000021;
  18.   strncpy(text,itemtext,12);
  19. }
  20.  
  21. MenuItem::MenuItem(char * itemtext, WimpWindow &w)
  22. {
  23.   flags=0;
  24.   window_handle = w.data->handle;
  25.   icon_flags = 0x7000021;
  26.   strncpy(text,itemtext,12);
  27. }
  28.  
  29. MenuItem::MenuItem(char * itemtext, WimpMenu &m)
  30. {
  31.   flags=0;
  32.   submenu = (int) &m.data;
  33.   icon_flags = 0x7000021;
  34.   strncpy(text,itemtext,12);
  35. }
  36.  
  37. MenuItem::MenuItem(WimpIcon &i)
  38. {
  39.   flags=0;
  40.   submenu = -1;
  41.   icon_flags = i.flags;
  42.   indirect_sprite.sprite = i.indirect_sprite.sprite;
  43.   indirect_sprite.sprite_area = i.indirect_sprite.sprite_area;
  44.   indirect_sprite.isname = i.indirect_sprite.isname;
  45. }
  46.  
  47. MenuItem::~MenuItem()
  48. {
  49. }
  50.  
  51. WimpMenu::WimpMenu(char *mtitle, int nb_entries)
  52. {
  53.   if (nb_entries < 1) throw ("WimpMenu::WimpMenu@inferior1");
  54.   data = (parameters *) new char[sizeof(parameters) +
  55.                                  sizeof(MenuItem)*(nb_entries-1)];
  56.   index = 0;
  57.   nb_items = nb_entries;
  58.   strncpy(data->title, mtitle, 12);
  59.   data->title_fcolor = 7;
  60.   data->title_bcolor = 2;
  61.   data->work_fcolor = 7;
  62.   data->work_bcolor = 0;
  63.   data->item_width = strlen(mtitle);
  64.   data->item_height = 44;
  65.   data->item_gap = 0;
  66.   data->item[0].flags = MenuItem::LAST;
  67.   data->item[0].submenu = -1;
  68.   data->item[0].icon_flags = 0x7000021;
  69.   data->item[0].text[0] = '\0';
  70. }
  71.  
  72. WimpMenu::~WimpMenu()
  73. {
  74.   delete data;
  75. }
  76.  
  77. void WimpMenu::realloc(int n_entry)
  78. {
  79.   int n,i;
  80.   parameters *dt;
  81.   
  82.   dt = (parameters *) new char[sizeof(parameters)
  83.                                + sizeof(MenuItem)*(n_entry-1)];
  84.   n = n_entry;
  85.   if (nb_items < n) n = nb_items;
  86.   memcpy(dt,data,sizeof(parameters));
  87.   for(i=0;i<n;i++) dt->item[i] = data->item[i];
  88.   delete data;
  89.   data = dt;
  90.   if(index>n) index = n;
  91.   nb_items = n_entry;                             
  92. }
  93.  
  94. WimpMenu &WimpMenu::operator << (MenuItem &mi)
  95. {
  96.   if (index >= nb_items) realloc(nb_items+1);
  97.   if (index > 0) data->item[index-1].flags &= !(MenuItem::LAST);
  98.   data->item[index] = mi;
  99.   data->item[index++].flags |= MenuItem::LAST;
  100.   return *this;
  101. }
  102.  
  103. WimpMenu &WimpMenu::operator << (char *text)
  104. {
  105.   if (index >= nb_items) realloc(nb_items+1);
  106.   if (index > 0) data->item[index-1].flags &= !(MenuItem::LAST);
  107.   data->item[index].flags = MenuItem::LAST;
  108.   data->item[index].submenu = -1;
  109.   data->item[index].icon_flags = 0x7000021;
  110.   strncpy(data->item[index++].text,text,12);
  111.   return *this;  
  112. }
  113.  
  114. MenuItem &WimpMenu::operator[] (int i)
  115. {
  116.   return data->item[i];
  117. }
  118.  
  119. MenuItem &WimpMenu::operator[] (char *t)
  120. {
  121.   int i,exit;
  122.   
  123.   for(i=0; ((i<index) && !exit); i++) exit = strcmp(data->item[i].text,t);
  124.   return data->item[i];
  125. }
  126.  
  127. void WimpMenu::open(int x0, int y0)
  128. {
  129.   int r[10];
  130.   os_error *e;
  131.   
  132.   
  133.   r[1] = (int) data;
  134.   r[2] = x0;
  135.   r[3] = y0;
  136.   if ((e = os_swi(Wimp_CreateMenu, r)) != NULL) throw(e);
  137. }
  138.  
  139. void WimpMenu::close()
  140. {
  141.   int r[10];
  142.   os_error *e;
  143.   
  144.   r[1] = -1;
  145.   if ((e = os_swi(Wimp_CreateMenu, r)) != NULL) throw(e);
  146. }
  147.